#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <ctime>
#include <string>
#include <filesystem>

using namespace std;

string generate_number(int len, int digit_count = 9) {
    string s;
    for(int i = 0; i < len; i++) {
        s += '1' + rand() % digit_count;
    }
    return s;
}

void generate_test(int test_num, int num_len, int max_cost, bool equal_cost = false, int digit_count = 9) {
    string filename = "data/bargain" + to_string(test_num) + ".in";
    freopen(filename.c_str(), "w", stdout);
    
    // 输出测试点编号和测试数据组数
    cout << test_num << endl;
    cout << 1 << endl;  // 每组测试只生成一组数据
    
    // 生成数字
    cout << generate_number(num_len, digit_count) << endl;
    
    // 生成删除代价
    if(equal_cost) {
        int cost = rand() % max_cost + 1;
        for(int i = 0; i < 9; i++) {
            cout << cost << (i == 8 ? '\n' : ' ');
        }
    } else {
        for(int i = 0; i < 9; i++) {
            cout << (rand() % max_cost + 1) << (i == 8 ? '\n' : ' ');
        }
    }
}

int main() {
    srand(time(0));
    
    // 创建data目录
    filesystem::create_directory("data");
    
    // 生成25组测试数据
    // 第1组：n < 100
    generate_test(1, 2, 100000);
    
    // 第2组：n < 10^3
    generate_test(2, 3, 100000);
    
    // 第3-6组：n < 10^18
    for(int i = 3; i <= 6; i++) {
        generate_test(i, 18, 100000);
    }
    
    // 第7-9组：n < 10^40
    for(int i = 7; i <= 9; i++) {
        generate_test(i, 40, 100000);
    }
    
    // 第10组：只包含一种数字
    generate_test(10, 1000, 100000, false, 1);
    
    // 第11组：只包含两种数字
    generate_test(11, 1000, 100000, false, 2);
    
    // 第12-13组：只包含三种数字
    for(int i = 12; i <= 13; i++) {
        generate_test(i, 1000, 100000, false, 3);
    }
    
    // 第14-16组：所有删除代价相等，n < 10^10^3
    for(int i = 14; i <= 16; i++) {
        generate_test(i, 1000, 100000, true);
    }
    
    // 第17-18组：所有删除代价相等，n < 10^10^5
    for(int i = 17; i <= 18; i++) {
        generate_test(i, 100000, 100000, true);
    }
    
    // 第19-20组：n < 10^100, vi ≤ 100
    for(int i = 19; i <= 20; i++) {
        generate_test(i, 100, 100);
    }
    
    // 第21-22组：n < 10^10^3, vi ≤ 10^3
    for(int i = 21; i <= 22; i++) {
        generate_test(i, 1000, 1000);
    }
    
    // 第23-25组：一般情况
    for(int i = 23; i <= 25; i++) {
        generate_test(i, 100000, 100000);
    }
    
    return 0;
} 